package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.SupervisorDAO;
import com.divemotor.ventarepuestosinternet.model.Departamento;
import com.divemotor.ventarepuestosinternet.model.Distrito;
import com.divemotor.ventarepuestosinternet.model.Provincia;
import com.divemotor.ventarepuestosinternet.model.Supervisor;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;

@Repository(value="supervisorDAO")
public class SupervisorDAOImpl extends GenericoDAOImpl<Supervisor, Integer> implements SupervisorDAO, Serializable{

	
	private static final long serialVersionUID = 1269938163977008488L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public SupervisorDAOImpl() {
		setClase(Supervisor.class);
	}
	
	@Override
	public List<Supervisor> listarTodos() {
		Criteria criteria=sessionFactory.getCurrentSession().createCriteria(Supervisor.class, "supervisor");
		   criteria.createAlias("supervisor.usuario", "usu");
			criteria.add(Restrictions.eq("usu.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
			criteria.add(Restrictions.not(Restrictions.eq("supervisor.estado", Constantes.ESTADO_ELIMINADO)));
			return criteria.list();
	}

	@Override
	public List<Supervisor> buscarUsuarios(Supervisor supervisor) {
		
		Criteria criteria=sessionFactory.getCurrentSession().createCriteria(Supervisor.class, "supervisor");
	    criteria.createAlias("supervisor.usuario", "usu");
		criteria.add(Restrictions.eq("usu.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		
		if (!supervisor.getUsuario().getNombres().equals("")) {
			criteria.add(Restrictions.like("usu.nombres", "%" + supervisor.getUsuario().getNombres() + "%").ignoreCase());
		}
		
		if (!supervisor.getUsuario().getApellidos().equals("")) {
			criteria.add(Restrictions.like("usu.apellidos", "%" + supervisor.getUsuario().getApellidos() + "%").ignoreCase());
		}
		

		if (!supervisor.getUsuario().getUsuario().equals("")) {
			criteria.add(Restrictions.like("usu.usuario", "%" + supervisor.getUsuario().getUsuario() + "%").ignoreCase());
		}
		
		if (!supervisor.getEstado().equals(Constantes.NO_SELECCIONADO_ETIQUETA)) {
			criteria.add(Restrictions.eq("supervisor.estado", supervisor.getEstado()));
		
		}
		
		if (supervisor.getListaSucursal().size() != 0) {
			criteria.createAlias("supervisor.listaSucursal", "suc");
			criteria.add(Restrictions.eq("suc.idSucursal", supervisor.getListaSucursal().get(0).getIdSucursal()));
		}
		
		criteria.add(Restrictions.not(Restrictions.eq("supervisor.estado", Constantes.ESTADO_ELIMINADO)));
		return criteria.list();
	}

	@Override
	public Supervisor obtenerPorCodigo(Supervisor supervisor) {
			
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Supervisor.class);
		criteria.createAlias("usuario", "usu");
		criteria.add(Restrictions.eq("usu.pais", DatosDeSession.obtenerPaisDelUsuarioAutenticado()));
		criteria.add(Restrictions.eq("codigo", supervisor.getCodigo()).ignoreCase());
		criteria.add(Restrictions.not(Restrictions.eq("estado","E")));
	        
		return (Supervisor)criteria.uniqueResult();
	}

	@Override
	public void eliminarConEstado(Supervisor supervisor) {
	   sessionFactory.getCurrentSession().merge(supervisor);
	}

	@Override
	public void eliminarPorUsuario(Supervisor supervisor) {
		sessionFactory.getCurrentSession().merge(supervisor);
	}

	@Override
	public Supervisor obtenerPorIdusuario(Usuario usuario) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Supervisor.class);
		criteria.add(Restrictions.eq("usuario", usuario));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		return (Supervisor) criteria.uniqueResult();
	}

	@Override
	public void insertarSinRetornar(Supervisor supervisor) {
		sessionFactory.getCurrentSession().persist(supervisor);
        sessionFactory.getCurrentSession().flush();
	}

	@Override
	public List<Departamento> obtenerDepartamentosPorSupervisor(Usuario user) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Supervisor.class,"supervisor");
		criteria.createAlias("supervisor.listaSucursal", "sucursal");
		criteria.createAlias("supervisor.usuario", "usuario");
		criteria.setProjection(Projections.distinct(Projections.property("sucursal.departamento")));
		criteria.add(Restrictions.eq("usuario.idUsuario", user.getIdUsuario()));
		criteria.add(Restrictions.not(Restrictions.eq("supervisor.estado", Constantes.ESTADO_ELIMINADO)));
	    return criteria.list();
	}

	@Override
	public List<Provincia> obtenerProvinciasPorSupervisorDepartamento(Usuario user, Integer idDepartamento) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Supervisor.class,"supervisor");
		criteria.createAlias("supervisor.listaSucursal", "sucursal");
		criteria.createAlias("supervisor.usuario", "usuario");
		criteria.createAlias("sucursal.departamento", "departamento");
		criteria.setProjection(Projections.distinct(Projections.property("sucursal.provincia")));
		criteria.add(Restrictions.eq("departamento.idDepartamento", idDepartamento));
		criteria.add(Restrictions.eq("usuario.idUsuario", user.getIdUsuario()));
		criteria.add(Restrictions.not(Restrictions.eq("supervisor.estado", Constantes.ESTADO_ELIMINADO)));
	    return criteria.list();
	}

	@Override
	public List<Distrito> obtenerDistritosPorSupervisorDepartamento(Usuario user, Integer idprovincia) {
		Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Supervisor.class,"supervisor");
		criteria.createAlias("supervisor.listaSucursal", "sucursal");
		criteria.createAlias("supervisor.usuario", "usuario");
		criteria.createAlias("sucursal.provincia", "provincia");
		criteria.setProjection(Projections.distinct(Projections.property("sucursal.distrito")));
		criteria.add(Restrictions.eq("provincia.idProvincia", idprovincia));
		criteria.add(Restrictions.eq("usuario.idUsuario", user.getIdUsuario()));
		criteria.add(Restrictions.not(Restrictions.eq("supervisor.estado", Constantes.ESTADO_ELIMINADO)));
	    return criteria.list();
	}

}
